package com.java.Stream;

import java.util.Arrays;
import java.util.stream.Stream;

public class MiddleAPI {
    public static void main(String[] args) {
        // concat：合并。将两个流合并为一个
        Stream.concat(Stream.of(1, 2, 3, 4), Stream.of(5, 6, 7))
                .forEach(item -> System.out.print(item + " ")); // 1 2 3 4 5 6 7
        System.out.println();
        
        // filter：过滤。回调函数返回true则保留
        Stream.of(1, 2, 3, 4, 5, 6, 7)
                .filter(item -> item <= 4)
                .filter(item -> item >= 3)
                .forEach(item -> System.out.print(item + " ")); // 3 4
        System.out.println();
        
        // limit：限制。从前往后获取指定数量的流
        Stream.of(1, 2, 3, 4, 5, 6, 7)
                .limit(4)
                .forEach(item -> System.out.print(item + " ")); // 1 2 3 4
        System.out.println();
        
        // skip：跳过。从前往后跳过指定数量的流
        Stream.of(1, 2, 3, 4, 5, 6, 7)
                .skip(4)
                .forEach(item -> System.out.print(item + " ")); // 5 6 7
        System.out.println();
        
        // distinct：去重。底层利用HashSet去重，重写hashCode和equals可自定义去重方式
        Stream.of(1, 1, 2, 2, 2, 3, 4)
                .distinct()
                .forEach(item -> System.out.print(item + " ")); // 1 2 3 4
        System.out.println();
        
        // map：映射。一对一映射
        Stream.of(1, 2, 3, 4, 5, 6, 7)
                .map(item -> item * 10)
                .forEach(item -> System.out.print(item + " ")); // 10 20 30 40 50 60 70
        System.out.println();
        
        // mapToInt & mapToLong & mapToDouble：映射。一对一映射成对应的XxxStream流，XxxStream针对不同数据提供更便捷API
        System.out.println(Stream.of(1, 2, 3, 4, 5, 6, 7)
                .mapToInt(item -> item * 10)
                .sum()); // 280
        
        // flatMap & flatMapToXxx：映射。一对多映射
        Stream.of(1, 2, 3, 4, 5, 6, 7)
                .map(item -> new int[]{item, item})
                .forEach(item -> System.out.print(item + " ")); // [I@7ef20235 [I@27d6c5e0 [I@4f3f5b24 [I@15aeb7ab [I@7b23ec81 [I@6acbcfc0 [I@5f184fc6
        System.out.println();
        Stream.of(1, 2, 3, 4, 5, 6, 7)
                .map(item -> new int[]{item, item}) // Stream<int> -> Stream<int[]>
                .flatMapToInt(Arrays::stream) // Stream<int[]> -> 拆解int[]后的新Stream<int>
                .forEach(item -> System.out.print(item + " ")); // 1 1 2 2 3 3 4 4 5 5 6 6 7 7
        System.out.println();
        
        // unordered⭐⭐⭐：unordered是一种优化机制。无unordered时先合并所有数据去重再分配到各个CPU再去重，有unordered时先对各个CPU中的数据去重再合并所有数据去重
        Stream.of(1, 2, 3, 4, 5, 6, 7)
                .unordered()
                .forEach(item -> System.out.print(item + " ")); // 1 2 3 4 5 6 7
        System.out.println();
        
        // sorted：排序。基本数据类型默认升序，引用数据类型需使用Comparator或Comparable
        Stream.of(7, 5, 3, 6, 2, 1, 4)
                .sorted()
                .forEach(item -> System.out.print(item + " ")); // 1 2 3 4 5 6 7
        System.out.println();
        Stream.of(7, 5, 3, 6, 2, 1, 4)
                .sorted((o1, o2) -> o2 - o1)
                .forEach(item -> System.out.print(item + " ")); // 7 6 5 4 3 2 1
        System.out.println();
    }
}
